package com.texaco.chapasFutbol.entidades;

import org.andengine.R;
import org.andengine.entity.sprite.Sprite;
import org.andengine.extension.physics.box2d.PhysicsFactory;
import org.andengine.opengl.texture.region.ITextureRegion;
import org.andengine.opengl.vbo.VertexBufferObjectManager;

import android.util.FloatMath;

import com.badlogic.gdx.physics.box2d.Body;
import com.badlogic.gdx.physics.box2d.BodyDef.BodyType;

/**
 * Clase que implementa los sprites que vamos a utilizar en nuestro juego de
 * chapas y futbol Las subclases deben de ser, chapas, pelota... (básicamente
 * cualquier objeto que se mueva en nuestro juego. Contendra las cosas comunes
 * que requieran nuestros sprites, tales como atlas, o fisicas.
 * 
 * @author texaco
 * 
 */
public class CFSprite extends Sprite {

	private Body body;
	protected Game game;

	public static final short CAT_PELOTA = 1;
	public static final short CAT_CHAPA = 2;
	public static final short CAT_MURO = 4;
	public static final short CAT_PORTERIA = 8;
	public static final short MASK_PELOTA = CAT_PELOTA + CAT_CHAPA + CAT_MURO;
	public static final short MASK_CHAPA = CAT_PELOTA + CAT_CHAPA +  CAT_MURO + CAT_PORTERIA;
	public static final short MASK_MURO = CAT_PELOTA + CAT_CHAPA;
	public static final short MASK_PORTERIA = CAT_CHAPA;

	private static final double VELOCIDAD_MAXIMA = 25;
	private static final double MAG_MAXIMA = 200; // FIXME: esta debe de ir con la que marque la chapa.

	public CFSprite(int xPos, int yPos, ITextureRegion shape,
			VertexBufferObjectManager vertex, Game game, float damping, Object userData) {

		super(xPos, yPos, shape, vertex);
		this.game = game;
		if (this instanceof Pelota) {
			body = PhysicsFactory.createCircleBody(game.getPhysicsWorld(),
					this, BodyType.DynamicBody, Pelota.FIXTURE);

		} else { // chapa
			body = PhysicsFactory.createCircleBody(game.getPhysicsWorld(),
					this, BodyType.DynamicBody, Chapa.FIXTURE);

		}
		//FIXME: Por algún motivo que no llego a comprender, al modificar los bordes
		// se le está aplicando a la pelota una fuerza circular, que impide que la 
		// pelota pare. Por lo tanto se da el caso de que nunca llega el turno
		// del equpo contrario, ya que la pelota sigue en movimiento.
		body.setAngularDamping(2);  

		/*
		 * Antes de incluir las chapas en el mundo físico, le modificamos el
		 * valor 'Damping' para que el efecto rebote sea menor.
		 */
		body.setLinearDamping(damping);
		
		body.setUserData(userData);
	}

	public Body getBody() {
		return this.body;
	}

	/**
	 * Necesitamos 3 areas.
	 * Velocidad minima.
	 * Velocidad de control.
	 * Velocidad máxima.
	 * 
	 * Parece que los valores pueden ir de:
	 * 130
	 * 550
	 * 
	 * Mientras que las velocidad podríamos enviar
	 * 5
	 * 100
	 * @param diferenceX
	 * @param diferenceY
	 */
	public void mover(float diferenceX, float diferenceY) {
		
		/*
		 * Obtnemos el angulo y la fuerza.
		 */
//		double mag = Math.sqrt((diferenceX*diferenceX) + (diferenceY*diferenceY));
		double mag = FloatMath.sqrt((diferenceX*diferenceX) + (diferenceY*diferenceY));

		/*
		 * Tenemos que normalizar para tener el tirador en elmismo ángulo pero con la
		 * magnitud máxima.
		 */
		double angulo = Math.atan(diferenceY/diferenceX);
		if(diferenceX < 0){
			angulo += Math.PI;
		}
		
		mag = mag * game.getActivity().getResources().getInteger(R.integer.velocidad_maxima) / game.getActivity().getResources().getInteger(R.integer.magnitud_maxima);
		
		double x = mag * Math.cos(angulo);
		double y = mag * Math.sin(angulo);

		body.setLinearVelocity((float)x, (float)y);
	}
}
